package workcount;

import java.io.IOException;
import java.nio.file.*;
import java.util.*;

/**
 * 统计一个目录下所有文本文件里面每个出现的单词次数
 *  --大数据分析入门案例
 *  单词次数统计
 *  -需要遍历所有的txt文件
 *  -读取每个文件，逐行解析单词
 *  -存储单词次数
 *  -最后将单词次数按大小降序排列输出
 *=======================================================
 *  需要遍历所有的txt文件
 *  -给定一个目录，遍历所有的子文件夹，递归或者FileSystem
 *  .读取每个文件，逐行解析每个单词
 *      -每次readLine读取一行，split为数组，再单独解析
 *  存储单词次数
 *      -相同的单词的次数需要累计，可以用HashMap
 *   最后将单词次数按大小降序排序输出
 *      -排序输出可以考虑Comparable接口
 * */
public class WorkCount {

    public static void main(String[] args) throws IOException {
        Path path = Paths.get("D:\\temp");
        Searcher walk = new Searcher("*.txt");
        //查找该目录下所有的txt的文件
        EnumSet<FileVisitOption> opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
        Files.walkFileTree(path,opts,Integer.MAX_VALUE,walk);
        ArrayList<String> filePaths = walk.getFilePaths();

        //解析每个文件的单词
        HashMap<String, Word> totalMap = new HashMap<>();
        for (String filePath : filePaths) {
            HashMap<String,Word> partMap = new FileAnalyzer(filePath).getWordCount();
            if (partMap!=null &&partMap.size()>0){
                combineMap(totalMap,partMap);
            }
        }

        //排序
        //Collection<Word> words = totalMap.Values();
        ArrayList<Word> words = new ArrayList<Word>(totalMap.values());
        Collections.sort(words);

        //输出
        System.out.println("最后结果");
        for (Word word : words) {
            System.out.println(word.getText()+","+word.getTimes());
        }
    }

    private static void combineMap(HashMap<String,Word> total, HashMap<String,Word> part) {
        Iterator<Map.Entry<String,Word>> iter = part.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry<String, Word> entry = iter.next();
            //获取key
            String partKey =entry.getKey();
            Word partWord = entry.getValue();
            if (total.containsKey(partKey)){
                Word totalWord = total.get(partKey);
                totalWord.setTimes(totalWord.getTimes()+partWord.getTimes());
            } else{
              total.put(partKey,partWord);
            }
        }
    }


}
